katello 4.2.1 → 4.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (498) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/katello.common.js +0 -67
  3. data/app/assets/javascripts/katello/common/katello.js +0 -27
  4. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  5. data/app/assets/stylesheets/katello/katello.scss +0 -1
  6. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +10 -2
  7. data/app/controllers/katello/api/v2/api_controller.rb +35 -9
  8. data/app/controllers/katello/api/v2/capsule_content_controller.rb +16 -2
  9. data/app/controllers/katello/api/v2/content_view_components_controller.rb +22 -1
  10. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +65 -1
  11. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +5 -1
  12. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -6
  13. data/app/controllers/katello/api/v2/debs_controller.rb +74 -1
  14. data/app/controllers/katello/api/v2/errata_controller.rb +13 -10
  15. data/app/controllers/katello/api/v2/file_units_controller.rb +1 -0
  16. data/app/controllers/katello/api/v2/generic_content_units_controller.rb +1 -1
  17. data/app/controllers/katello/api/v2/host_errata_controller.rb +46 -5
  18. data/app/controllers/katello/api/v2/host_tracer_controller.rb +2 -1
  19. data/app/controllers/katello/api/v2/module_streams_controller.rb +4 -0
  20. data/app/controllers/katello/api/v2/organizations_controller.rb +22 -7
  21. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -1
  22. data/app/controllers/katello/api/v2/repositories_controller.rb +36 -19
  23. data/app/controllers/katello/api/v2/subscriptions_controller.rb +0 -8
  24. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +5 -1
  25. data/app/controllers/katello/concerns/api/v2/bulk_extensions.rb +40 -0
  26. data/app/controllers/katello/concerns/api/v2/host_errata_extensions.rb +4 -31
  27. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +1 -1
  28. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +1 -1
  29. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +2 -6
  30. data/app/helpers/katello/katello_url_helper.rb +1 -1
  31. data/app/lib/actions/candlepin/abstract_async_task.rb +6 -3
  32. data/app/lib/actions/candlepin/async_hypervisors.rb +12 -8
  33. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +10 -1
  34. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +3 -3
  35. data/app/lib/actions/katello/cdn_configuration/update.rb +38 -0
  36. data/app/lib/actions/katello/content_view/remove.rb +18 -7
  37. data/app/lib/actions/katello/content_view_version/destroy.rb +2 -2
  38. data/app/lib/actions/katello/content_view_version/republish_repositories.rb +1 -1
  39. data/app/lib/actions/katello/repository/clone_contents.rb +1 -2
  40. data/app/lib/actions/katello/repository/destroy.rb +21 -5
  41. data/app/lib/actions/katello/repository/fetch_pxe_files.rb +1 -1
  42. data/app/lib/actions/katello/repository/finish_upload.rb +1 -1
  43. data/app/lib/actions/katello/repository/import_upload.rb +1 -1
  44. data/app/lib/actions/katello/repository/index_content.rb +19 -6
  45. data/app/lib/actions/katello/repository/metadata_generate.rb +2 -0
  46. data/app/lib/actions/katello/repository/multi_clone_contents.rb +1 -1
  47. data/app/lib/actions/katello/repository/remove_content.rb +1 -1
  48. data/app/lib/actions/katello/repository/sync.rb +3 -7
  49. data/app/lib/actions/katello/repository_set/scan_cdn.rb +0 -4
  50. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +1 -1
  51. data/app/lib/actions/pulp/orphan_cleanup/remove_unneeded_repos.rb +1 -1
  52. data/app/lib/actions/pulp/repository/clear.rb +1 -1
  53. data/app/lib/actions/pulp3/abstract_async_task.rb +10 -1
  54. data/app/lib/actions/pulp3/capsule_content/generate_metadata.rb +13 -18
  55. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +1 -11
  56. data/app/lib/actions/pulp3/content_view_version/create_export_history.rb +1 -1
  57. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +3 -1
  58. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +25 -42
  59. data/app/lib/actions/pulp3/orchestration/repository/sync.rb +8 -1
  60. data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +3 -3
  61. data/app/lib/actions/pulp3/repository/commit_upload.rb +1 -1
  62. data/app/lib/actions/pulp3/repository/import_upload.rb +8 -4
  63. data/app/lib/actions/pulp3/repository/multi_copy_content.rb +1 -1
  64. data/app/lib/actions/pulp3/repository/multi_copy_units.rb +1 -1
  65. data/app/lib/actions/pulp3/repository/presenters/abstract_sync_presenter.rb +18 -0
  66. data/app/lib/actions/pulp3/repository/presenters/content_unit_presenter.rb +7 -2
  67. data/app/lib/actions/pulp3/repository/presenters/repair_presenter.rb +6 -1
  68. data/app/lib/actions/pulp3/repository/save_artifact.rb +14 -4
  69. data/app/lib/katello/errors.rb +2 -0
  70. data/app/lib/katello/resources/candlepin/consumer.rb +0 -20
  71. data/app/lib/katello/resources/candlepin/proxy.rb +8 -2
  72. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +2 -0
  73. data/app/lib/katello/resources/cdn/katello_cdn.rb +68 -0
  74. data/app/lib/katello/resources/cdn.rb +61 -29
  75. data/app/lib/katello/util/cdn_var_substitutor.rb +15 -9
  76. data/app/lib/katello/util/package.rb +22 -0
  77. data/app/lib/katello/util/path_with_substitutions.rb +12 -14
  78. data/app/models/katello/activation_key.rb +10 -0
  79. data/app/models/katello/ansible_collection.rb +1 -1
  80. data/app/models/katello/authorization/repository.rb +4 -4
  81. data/app/models/katello/candlepin/repository_mapper.rb +5 -1
  82. data/app/models/katello/cdn_configuration.rb +32 -0
  83. data/app/models/katello/concerns/content_facet_host_extensions.rb +40 -0
  84. data/app/models/katello/concerns/host_managed_extensions.rb +28 -2
  85. data/app/models/katello/concerns/hostgroup_extensions.rb +1 -1
  86. data/app/models/katello/concerns/organization_extensions.rb +3 -1
  87. data/app/models/katello/concerns/pulp_database_unit.rb +15 -5
  88. data/app/models/katello/concerns/remote_execution_provider_extensions.rb +9 -0
  89. data/app/models/katello/concerns/setting_extensions.rb +1 -1
  90. data/app/models/katello/concerns/smart_proxy_extensions.rb +4 -3
  91. data/app/models/katello/content_credential.rb +4 -0
  92. data/app/models/katello/content_facet_applicable_deb.rb +7 -0
  93. data/app/models/katello/content_view.rb +24 -1
  94. data/app/models/katello/content_view_component.rb +4 -0
  95. data/app/models/katello/content_view_erratum_filter.rb +2 -0
  96. data/app/models/katello/content_view_filter.rb +1 -1
  97. data/app/models/katello/content_view_package_filter_rule.rb +2 -1
  98. data/app/models/katello/content_view_version.rb +30 -1
  99. data/app/models/katello/deb.rb +71 -0
  100. data/app/models/katello/erratum.rb +13 -1
  101. data/app/models/katello/generic_content_unit.rb +3 -1
  102. data/app/models/katello/glue/pulp/repos.rb +2 -2
  103. data/app/models/katello/host/content_facet.rb +23 -2
  104. data/app/models/katello/host/subscription_facet.rb +1 -1
  105. data/app/models/katello/host_tracer.rb +21 -2
  106. data/app/models/katello/installed_deb.rb +1 -1
  107. data/app/models/katello/module_stream.rb +4 -0
  108. data/app/models/katello/ping.rb +20 -4
  109. data/app/models/katello/product.rb +7 -5
  110. data/app/models/katello/provider.rb +1 -24
  111. data/app/models/katello/repository.rb +37 -10
  112. data/app/models/katello/root_repository.rb +28 -14
  113. data/app/models/setting/content.rb +8 -13
  114. data/app/services/katello/applicability/applicable_content_helper.rb +20 -0
  115. data/app/services/katello/organization_creator.rb +8 -0
  116. data/app/services/katello/pulp3/api/ansible_collection.rb +0 -40
  117. data/app/services/katello/pulp3/api/apt.rb +0 -47
  118. data/app/services/katello/pulp3/api/content_guard.rb +1 -1
  119. data/app/services/katello/pulp3/api/core.rb +28 -23
  120. data/app/services/katello/pulp3/api/docker.rb +0 -50
  121. data/app/services/katello/pulp3/api/file.rb +0 -48
  122. data/app/services/katello/pulp3/api/generic.rb +1 -44
  123. data/app/services/katello/pulp3/api/yum.rb +4 -44
  124. data/app/services/katello/pulp3/generic_content_unit.rb +8 -4
  125. data/app/services/katello/pulp3/repository/ansible_collection.rb +4 -0
  126. data/app/services/katello/pulp3/repository/apt.rb +3 -3
  127. data/app/services/katello/pulp3/repository/generic.rb +10 -65
  128. data/app/services/katello/pulp3/repository/yum.rb +10 -0
  129. data/app/services/katello/pulp3/repository.rb +47 -21
  130. data/app/services/katello/pulp3/repository_mirror.rb +30 -11
  131. data/app/services/katello/pulp3/rpm.rb +2 -32
  132. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +7 -8
  133. data/app/services/katello/pulp3/smart_proxy_repository.rb +1 -1
  134. data/app/services/katello/registration_manager.rb +2 -0
  135. data/app/services/katello/repository_type.rb +103 -15
  136. data/app/services/katello/repository_type_manager.rb +14 -8
  137. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  138. data/app/services/katello/upstream_connection_checker.rb +1 -0
  139. data/app/views/foreman/job_templates/resolve_traces.erb +25 -0
  140. data/app/views/foreman/job_templates/resolve_traces_-_katello_ansible_default.erb +28 -0
  141. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  142. data/app/views/katello/api/v2/common/_metadata.json.rabl +1 -0
  143. data/app/views/katello/api/v2/content_facet/base.json.rabl +3 -1
  144. data/app/views/katello/api/v2/content_facet/show.json.rabl +2 -1
  145. data/app/views/katello/api/v2/content_view_components/show.json.rabl +4 -0
  146. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +7 -0
  147. data/app/views/katello/api/v2/content_views/base.json.rabl +12 -8
  148. data/app/views/katello/api/v2/content_views/index.json.rabl +1 -0
  149. data/app/views/katello/api/v2/content_views/permissions.rabl +8 -0
  150. data/app/views/katello/api/v2/debs/base.json.rabl +5 -0
  151. data/app/views/katello/api/v2/errata/index.json.rabl +4 -0
  152. data/app/views/katello/api/v2/generic_content_units/base.json.rabl +2 -0
  153. data/app/views/katello/api/v2/generic_content_units/show.json.rabl +7 -0
  154. data/app/views/katello/api/v2/host_tracer/base.json.rabl +1 -0
  155. data/app/views/katello/api/v2/module_streams/index.json.rabl +4 -0
  156. data/app/views/katello/api/v2/organizations/cdn_configuration.rabl +1 -0
  157. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -0
  158. data/app/views/katello/api/v2/repositories/base.json.rabl +10 -17
  159. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +2 -6
  160. data/config/routes/api/v2.rb +13 -0
  161. data/config/routes/overrides.rb +2 -0
  162. data/config/routes.rb +14 -2
  163. data/db/migrate/20140110000001_update_environments_add_katello_id.rb +1 -3
  164. data/db/migrate/20140610154745_content_view_puppet_environment_id.rb +0 -35
  165. data/db/migrate/20190802112101_add_applicable_debs.rb +16 -0
  166. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +2 -2
  167. data/db/migrate/20210909140337_add_last_indexed_to_repos.rb +5 -0
  168. data/db/migrate/20210910190324_move_background_settings_to_immediate.rb +25 -0
  169. data/db/migrate/20211006161617_add_filename_to_katello_generic_content_units.rb +5 -0
  170. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +30 -0
  171. data/db/migrate/20211025181315_add_additional_metadata_to_katello_generic_content_units.rb +5 -0
  172. data/engines/bastion/README.md +15 -0
  173. data/engines/bastion/app/assets/javascripts/bastion/components/nutupane.factory.js +2 -2
  174. data/engines/bastion/config/routes.rb +2 -0
  175. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +3 -3
  176. data/engines/bastion/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +3 -0
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/registration.html +1 -1
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-applicable.controller.js +44 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs.controller.js +1 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-applicable.html +70 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs.html +1 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +10 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +5 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +25 -9
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +2 -2
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-versions.html +0 -9
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.controller.js +22 -2
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.routes.js +1 -1
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb.controller.js +22 -2
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-content-views.html +1 -1
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +36 -4
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-repositories.html +1 -1
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb.html +4 -4
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/views/debs.html +31 -4
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.factory.js +21 -0
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.module.js +17 -0
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/package.controller.js +4 -0
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +3 -3
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +6 -2
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +30 -2
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +1 -13
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +32 -9
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +15 -4
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +32 -19
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +28 -28
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-manage-generic-content.html +57 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +46 -4
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +57 -27
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.module.js +1 -0
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.routes.js +16 -7
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +30 -4
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository.factory.js +2 -1
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +8 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/sync-plan-details-info.controller.js +6 -2
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/views/sync-plan-info.html +1 -1
  217. data/engines/bastion_katello/lib/bastion_katello/engine.rb +1 -1
  218. data/lib/katello/engine.rb +0 -1
  219. data/lib/katello/permission_creator.rb +4 -3
  220. data/lib/katello/permissions/host_permissions.rb +1 -0
  221. data/lib/katello/permissions/organization_permissions.rb +2 -1
  222. data/lib/katello/plugin.rb +15 -11
  223. data/lib/katello/repository_types/ansible_collection.rb +13 -1
  224. data/lib/katello/repository_types/deb.rb +13 -0
  225. data/lib/katello/repository_types/docker.rb +13 -1
  226. data/lib/katello/repository_types/file.rb +13 -0
  227. data/lib/katello/repository_types/ostree.rb +48 -4
  228. data/lib/katello/repository_types/python.rb +26 -12
  229. data/lib/katello/repository_types/yum.rb +16 -1
  230. data/lib/katello/tasks/repository.rake +3 -12
  231. data/lib/katello/tasks/reset.rake +4 -5
  232. data/lib/katello/version.rb +1 -1
  233. data/package.json +3 -2
  234. data/webpack/__mocks__/react-intl/index.js +4 -0
  235. data/webpack/components/ActionableDetail.js +23 -3
  236. data/webpack/components/AddedStatusLabel.js +1 -1
  237. data/webpack/components/Bookmark/AddBookmarkModal.js +96 -0
  238. data/webpack/components/Bookmark/Bookmark.scss +28 -0
  239. data/webpack/components/Bookmark/BookmarkActions.js +24 -0
  240. data/webpack/components/Bookmark/BookmarkConstants.js +3 -0
  241. data/webpack/components/Bookmark/BookmarkSelectors.js +15 -0
  242. data/webpack/components/Bookmark/index.js +94 -0
  243. data/webpack/components/EditableSwitch.js +6 -1
  244. data/webpack/components/EditableTextInput/EditableTextInput.js +41 -13
  245. data/webpack/components/Errata/index.js +69 -0
  246. data/webpack/components/ErratumTypeLabel.js +31 -0
  247. data/webpack/components/Loading.js +5 -2
  248. data/webpack/components/RoutedTabs/__tests__/RoutedTabs.test.js +5 -11
  249. data/webpack/components/RoutedTabs/index.js +77 -2
  250. data/webpack/components/Search/Search.js +67 -80
  251. data/webpack/components/Search/__tests__/search.test.js +8 -26
  252. data/webpack/components/SelectAllCheckbox/SelectAllCheckbox.scss +3 -0
  253. data/webpack/components/SelectAllCheckbox/index.js +126 -0
  254. data/webpack/components/SelectableDropdown/SelectableDropdown.js +7 -2
  255. data/webpack/components/Table/EmptyStateMessage.js +38 -17
  256. data/webpack/components/Table/MainTable.js +49 -10
  257. data/webpack/components/Table/MainTable.scss +11 -0
  258. data/webpack/components/Table/PageControls.js +45 -0
  259. data/webpack/components/Table/TableHooks.js +230 -0
  260. data/webpack/components/Table/TableWrapper.js +221 -50
  261. data/webpack/components/Table/helpers.js +17 -0
  262. data/webpack/components/TypeAhead/TypeAhead.js +74 -58
  263. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +25 -10
  264. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.scss +9 -8
  265. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -2
  266. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +32 -22
  267. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +101 -0
  268. data/webpack/components/extensions/HostDetails/Cards/__tests__/contentViewDetailsCard.test.js +53 -0
  269. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataActions.js +47 -0
  270. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataConstants.js +32 -0
  271. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataSelectors.js +16 -0
  272. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/EmptyPage.js +19 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +17 -0
  274. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +7 -0
  275. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/helpers.js +3 -0
  276. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +40 -0
  277. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerEmptyState.js +42 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerModal.js +118 -0
  279. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.js +347 -0
  280. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +16 -0
  281. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionContents.js +60 -0
  282. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionDetail.js +69 -0
  283. data/webpack/components/extensions/HostDetails/Tabs/HostTracesActions.js +19 -0
  284. data/webpack/components/extensions/HostDetails/Tabs/HostTracesConstants.js +2 -0
  285. data/webpack/components/extensions/HostDetails/Tabs/HostTracesSelectors.js +19 -0
  286. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +56 -0
  287. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +5 -0
  288. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.js +188 -0
  289. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +12 -0
  290. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errata.fixtures.json +67 -0
  291. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +785 -0
  292. data/webpack/components/extensions/HostDetails/Tabs/__tests__/resolveTraces.fixtures.json +35 -0
  293. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEmptyTraceResults.fixtures.json +7 -0
  294. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEnableJobInvocation.fixtures.json +35 -0
  295. data/webpack/components/extensions/HostDetails/Tabs/__tests__/traces.fixtures.json +44 -0
  296. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +386 -0
  297. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +20 -0
  298. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  299. data/webpack/components/extensions/RegistrationCommands/index.js +1 -1
  300. data/webpack/components/pf3Table/components/Table.js +1 -1
  301. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +3 -3
  302. data/webpack/containers/Application/Routes.js +3 -3
  303. data/webpack/containers/Application/config.js +21 -6
  304. data/webpack/containers/Application/overrides.scss +34 -3
  305. data/webpack/{fills_index.js → global_index.js} +11 -2
  306. data/webpack/global_test_setup.js +6 -1
  307. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -4
  308. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsTableSchema.js +1 -1
  309. data/webpack/scenes/Content/ContentActions.js +31 -0
  310. data/webpack/scenes/Content/ContentConfig.js +138 -0
  311. data/webpack/scenes/Content/ContentConstants.js +7 -0
  312. data/webpack/scenes/Content/ContentPage.js +89 -0
  313. data/webpack/scenes/Content/ContentSelectors.js +43 -0
  314. data/webpack/scenes/Content/Details/ContentCounts.js +42 -0
  315. data/webpack/scenes/Content/Details/ContentDetails.js +66 -0
  316. data/webpack/scenes/Content/Details/ContentInfo.js +60 -0
  317. data/webpack/scenes/Content/Details/ContentRepositories.js +78 -0
  318. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionDetails.fixtures.json +20 -0
  319. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionRepositoryDetails.fixtures.json +71 -0
  320. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +152 -0
  321. data/webpack/scenes/Content/Details/__tests__/pythonPackageDetails.fixtures.json +20 -0
  322. data/webpack/scenes/Content/Details/__tests__/pythonPackageRepositoryDetails.fixtures.json +71 -0
  323. data/webpack/scenes/Content/Details/index.js +4 -0
  324. data/webpack/scenes/Content/Table/ContentTable.js +90 -0
  325. data/webpack/scenes/Content/Table/index.js +3 -0
  326. data/webpack/scenes/Content/__tests__/ansibleCollections.fixtures.json +50 -0
  327. data/webpack/scenes/Content/__tests__/contentTable.test.js +89 -0
  328. data/webpack/scenes/Content/__tests__/contentTypes.fixtures.json +66 -0
  329. data/webpack/scenes/Content/__tests__/pythonPackages.fixtures.json +30 -0
  330. data/webpack/scenes/Content/index.js +4 -0
  331. data/webpack/scenes/ContentViews/ContentViewSelectors.js +5 -6
  332. data/webpack/scenes/ContentViews/ContentViewsActions.js +13 -8
  333. data/webpack/scenes/ContentViews/ContentViewsConstants.js +31 -4
  334. data/webpack/scenes/ContentViews/ContentViewsPage.js +4 -0
  335. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +19 -7
  336. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +7 -5
  337. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +1 -1
  338. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +7 -3
  339. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -2
  340. data/webpack/scenes/ContentViews/Delete/CVDeleteContext.js +4 -0
  341. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +170 -0
  342. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +108 -0
  343. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +69 -0
  344. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +121 -0
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +120 -0
  346. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +62 -0
  347. data/webpack/scenes/ContentViews/Delete/Steps/CVEnvironmentSelectionForm.scss +4 -0
  348. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +259 -0
  349. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +155 -0
  350. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +241 -0
  351. data/webpack/scenes/ContentViews/Delete/__tests__/cvDetails.fixtures.json +248 -0
  352. data/webpack/scenes/ContentViews/Delete/__tests__/cvVersionsData.fixtures.json +865 -0
  353. data/webpack/scenes/ContentViews/Delete/__tests__/envPathData.fixtures.json +424 -0
  354. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +15 -7
  355. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +123 -0
  356. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentEnvironments.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +8 -5
  358. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +109 -51
  359. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.fixtures.json +21 -6
  360. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +80 -16
  361. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +248 -3
  362. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +141 -0
  363. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +36 -54
  364. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +20 -4
  365. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +63 -38
  366. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +3 -4
  367. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +65 -0
  368. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +260 -0
  369. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +54 -0
  370. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +202 -0
  371. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +291 -0
  372. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +441 -0
  373. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +62 -3
  374. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +302 -0
  375. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +186 -23
  376. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +144 -19
  377. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +2 -0
  378. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +44 -13
  379. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +81 -17
  380. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +43 -43
  381. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +96 -0
  382. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContent.fixtures.json +166 -0
  383. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +90 -0
  384. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentSearch.fixtures.json +33 -0
  385. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +91 -0
  386. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +237 -0
  387. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.fixtures.json +42 -0
  388. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +265 -0
  389. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +218 -11
  390. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +517 -0
  391. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterErrata.fixtures.json +122 -0
  392. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterModulesStreams.fixtures.json +60 -0
  393. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewErrataByDateDetails.fixtures.json +359 -0
  394. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetail.fixtures.json +88 -102
  395. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +34 -9
  396. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +148 -132
  397. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +25 -7
  398. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvAllRepos.fixtures.json +150 -0
  399. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +74 -0
  400. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +404 -0
  401. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErratumFilterDetails.fixtures.json +89 -0
  402. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailModuleAffectedRepos.fixtures.json +383 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailWithAffectedRepos.fixtures.json +375 -0
  404. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterFixutre.fixture.json +282 -0
  405. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +392 -0
  406. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilterDetails.fixtures.json +97 -0
  407. data/webpack/scenes/ContentViews/Details/Filters/index.js +26 -0
  408. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +68 -79
  409. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +1 -2
  410. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +163 -0
  411. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromoteSelectors.js +16 -0
  412. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +9 -1
  413. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +88 -74
  414. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +8 -9
  415. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.fixtures.json +3 -3
  416. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +30 -9
  417. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionEnvironments.js +1 -1
  418. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.js +9 -5
  419. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.scss +2 -2
  420. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +132 -14
  421. data/webpack/scenes/ContentViews/Details/Versions/Delete/DeleteContext.js +4 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +176 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +127 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +131 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +128 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +94 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +67 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedActivationKeys.fixture.json +53 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +153 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvDropDownOptionsResponse.fixture.json +192 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +313 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemoveResponse.fixture.json +74 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionRemoveEnvPaths.fixtures.json +352 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionsResponseData.fixtures.json +583 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +96 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +97 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +332 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +128 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +44 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +66 -0
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +125 -0
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +115 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionAnsibleCollections.fixtures.json +449 -0
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionComponent.fixtures.json +753 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDebPackages.fixtures.json +58 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +158 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +289 -0
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsCounts.fixtures.json +73 -0
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +44 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDockerTags.fixtures.json +3024 -0
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionErrata.fixtures.json +201 -0
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionFiles.fixtures.json +22 -0
  453. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionModuleStreams.fixtures.json +196 -0
  454. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRepositories.fixtures.json +1000 -0
  455. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackageGroups.fixtures.json +44 -0
  456. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackages.fixtures.json +394 -0
  457. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.fixtures.json +4 -4
  458. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +95 -26
  459. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersionsWithTask.fixtures.json +2 -2
  460. data/webpack/scenes/ContentViews/Details/Versions/index.js +25 -0
  461. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +20 -16
  462. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +3 -5
  463. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +106 -64
  464. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +25 -4
  465. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +1 -1
  466. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +4 -1
  467. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +29 -36
  468. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +10 -0
  469. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +117 -0
  470. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +59 -0
  471. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  472. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +30 -11
  473. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +1 -1
  474. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +38 -1
  475. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +79 -0
  476. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +107 -0
  477. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +59 -0
  478. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsResponse.fixtures.json +116 -0
  479. data/webpack/scenes/ContentViews/expansions/__tests__/relatedCompositeCvs.fixtures.json +4 -0
  480. data/webpack/scenes/ContentViews/helpers.js +1 -0
  481. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepository/RepositorySetRepository.js +1 -1
  482. data/webpack/scenes/RedHatRepositories/components/SearchBar.js +4 -3
  483. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +1 -1
  484. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +17 -9
  485. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +3 -3
  486. data/webpack/test-utils/nockWrapper.js +20 -3
  487. data/webpack/utils/helpers.js +16 -2
  488. data/webpack/utils/useDebounce.js +20 -0
  489. metadata +232 -54
  490. data/app/assets/javascripts/katello/widgets/tabs.js +0 -13
  491. data/app/assets/stylesheets/katello/widgets/tabs.scss +0 -69
  492. data/app/lib/actions/katello/provider/update.rb +0 -38
  493. data/webpack/components/RoutedTabs/RoutedTabs.js +0 -90
  494. data/webpack/components/Search/Search.test.js +0 -23
  495. data/webpack/components/Search/__snapshots__/Search.test.js.snap +0 -21
  496. data/webpack/components/extensions/HostDetails/Tabs/ContentTab.js +0 -42
  497. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +0 -145
  498. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionPackages.js +0 -0
@@ -0,0 +1,785 @@
1
+ import React from 'react';
2
+ import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
3
+ import { nockInstance, assertNockRequest, mockForemanAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
4
+ import { foremanApi } from '../../../../../services/api';
5
+ import { HOST_ERRATA_KEY } from '../../HostErrata/HostErrataConstants';
6
+ import { ErrataTab } from '../ErrataTab';
7
+ import mockErrataData from './errata.fixtures.json';
8
+
9
+ const contentFacetAttributes = {
10
+ id: 11,
11
+ uuid: 'e5761ea3-4117-4ecf-83d0-b694f99b389e',
12
+ content_view_default: false,
13
+ lifecycle_environment_library: false,
14
+ };
15
+
16
+ const renderOptions = (facetAttributes = contentFacetAttributes) => ({
17
+ apiNamespace: HOST_ERRATA_KEY,
18
+ initialState: {
19
+ API: {
20
+ HOST_DETAILS: {
21
+ response: {
22
+ id: 1,
23
+ content_facet_attributes: { ...facetAttributes },
24
+ },
25
+ status: 'RESOLVED',
26
+ },
27
+ },
28
+ },
29
+ });
30
+
31
+ const makeMockErrata = ({ pageSize = 20, total = 100, page = 1 }) => {
32
+ const mockErrataResults = [];
33
+ for (let i = (page * 1000); i < (page * 1000) + pageSize; i += 1) {
34
+ mockErrataResults.push({
35
+ id: i,
36
+ severity: 'Important',
37
+ title: `Errata${i}`,
38
+ type: (i % 2 === 0) ? 'security' : 'enhancement',
39
+ host_id: 1,
40
+ errata_id: `Errata${i}`,
41
+ bugs: [],
42
+ cves: [],
43
+ packages: [],
44
+ module_streams: [],
45
+ installable: true,
46
+ });
47
+ }
48
+
49
+ return {
50
+ total,
51
+ subtotal: total,
52
+ selectable: total,
53
+ page,
54
+ per_page: pageSize,
55
+ error: null,
56
+ search: null,
57
+ results: mockErrataResults,
58
+ };
59
+ };
60
+
61
+ const hostErrata = foremanApi.getApiUrl('/hosts/1/errata');
62
+ const autocompleteUrl = '/hosts/1/errata/auto_complete_search';
63
+ const defaultQueryWithoutSearch = {
64
+ include_applicable: false,
65
+ per_page: 20,
66
+ page: 1,
67
+ };
68
+ const defaultQuery = { ...defaultQueryWithoutSearch, search: '' };
69
+ const page2Query = { ...defaultQueryWithoutSearch, page: 2 };
70
+
71
+ let firstErrata;
72
+ let thirdErrata;
73
+ let searchDelayScope;
74
+ let autoSearchScope;
75
+
76
+ beforeEach(() => {
77
+ // jest.resetModules();
78
+ const { results } = mockErrataData;
79
+ [firstErrata, , thirdErrata] = results;
80
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
81
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
82
+ });
83
+
84
+ afterEach(() => {
85
+ assertNockRequest(searchDelayScope);
86
+ assertNockRequest(autoSearchScope);
87
+ });
88
+
89
+ test('Can call API for errata and show on screen on page load', async (done) => {
90
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
91
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
92
+ // return tracedata results when we look for errata
93
+ const scope = nockInstance
94
+ .get(hostErrata)
95
+ .query(defaultQuery)
96
+ .reply(200, mockErrataData);
97
+
98
+ const { getAllByText } = renderWithRedux(<ErrataTab />, renderOptions());
99
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
100
+ await patientlyWaitFor(() => expect(getAllByText(firstErrata.severity)[0]).toBeInTheDocument());
101
+ // Assert request was made and completed, see helper function
102
+ assertNockRequest(autocompleteScope);
103
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
104
+ });
105
+
106
+ test('Can handle no errata being present', async (done) => {
107
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
108
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
109
+
110
+ const noResults = {
111
+ total: 0,
112
+ subtotal: 0,
113
+ page: 1,
114
+ per_page: 20,
115
+ results: [],
116
+ };
117
+
118
+ const scope = nockInstance
119
+ .get(hostErrata)
120
+ .query(defaultQuery)
121
+ .reply(200, noResults);
122
+
123
+ const { queryByText } = renderWithRedux(<ErrataTab />, renderOptions());
124
+
125
+ // Assert that there are not any errata showing on the screen.
126
+ await patientlyWaitFor(() => expect(queryByText('This host does not have any installable errata.')).toBeInTheDocument());
127
+ // Assert request was made and completed, see helper function
128
+ assertNockRequest(autocompleteScope);
129
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
130
+ });
131
+
132
+ test('Can display expanded errata details', async (done) => {
133
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
134
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
135
+
136
+ // return tracedata results when we look for errata
137
+ const scope = nockInstance
138
+ .get(hostErrata)
139
+ .query(defaultQuery)
140
+ .reply(200, mockErrataData);
141
+
142
+ const {
143
+ getByText,
144
+ queryByText,
145
+ getAllByText,
146
+ getAllByLabelText,
147
+ } = renderWithRedux(<ErrataTab />, renderOptions());
148
+
149
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
150
+ await patientlyWaitFor(() => expect(getAllByText(firstErrata.severity)[0]).toBeInTheDocument());
151
+ const firstExpansion = getAllByLabelText('Details')[0];
152
+
153
+ firstExpansion.click();
154
+ expect(getAllByText('CVEs').length).toBeGreaterThan(0);
155
+ // the errata details should now be visible
156
+ expect(getByText(firstErrata.summary)).toBeVisible();
157
+
158
+ const cveTreeItem = getAllByText('CVEs')[0];
159
+ expect(cveTreeItem).toBeVisible();
160
+ cveTreeItem.click();
161
+ // the CVE should now be visible
162
+ expect(getByText(firstErrata.cves[0].cve_id)).toBeInTheDocument();
163
+ cveTreeItem.click();
164
+ // the CVE should now have disappeared
165
+ expect(queryByText(firstErrata.cves[0].cve_id)).not.toBeInTheDocument();
166
+
167
+ firstExpansion.click();
168
+ // the errata details should now be hidden
169
+ expect(getByText(firstErrata.summary)).not.toBeVisible();
170
+ // Assert request was made and completed, see helper function
171
+ assertNockRequest(autocompleteScope);
172
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
173
+ });
174
+
175
+ test('Can select one errata', async (done) => {
176
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
177
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
178
+
179
+ // return errata data results when we look for errata
180
+ const scope = nockInstance
181
+ .get(hostErrata)
182
+ .query(defaultQuery)
183
+ .reply(200, mockErrataData);
184
+
185
+ const {
186
+ queryByText,
187
+ getAllByText,
188
+ getByLabelText,
189
+ } = renderWithRedux(<ErrataTab />, renderOptions());
190
+
191
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
192
+ await patientlyWaitFor(() => expect(getAllByText(firstErrata.severity)[0]).toBeInTheDocument());
193
+
194
+ expect(queryByText('1 selected')).not.toBeInTheDocument();
195
+
196
+ const firstCheckBox = getByLabelText('Select row 0');
197
+ firstCheckBox.click();
198
+
199
+ const selectAllCheckbox = getByLabelText('Select all');
200
+ expect(selectAllCheckbox.checked).toEqual(false);
201
+
202
+ expect(queryByText('1 selected')).toBeInTheDocument();
203
+
204
+ assertNockRequest(autocompleteScope);
205
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
206
+ });
207
+
208
+ test('Can select all errata across pages through checkbox', async (done) => {
209
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
210
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
211
+ const mockErrata = makeMockErrata({ page: 1 });
212
+ // return errata data results when we look for errata
213
+
214
+ // return errata data results when we look for errata
215
+ const scope = nockInstance
216
+ .get(hostErrata)
217
+ .query(defaultQuery)
218
+ .reply(200, mockErrata);
219
+
220
+ const scope2 = nockInstance
221
+ .get(hostErrata)
222
+ .query(page2Query)
223
+ .reply(200, makeMockErrata({ page: 2 }));
224
+
225
+ const {
226
+ queryByText,
227
+ getAllByText,
228
+ getByLabelText,
229
+ getAllByLabelText,
230
+ } = renderWithRedux(<ErrataTab />, renderOptions());
231
+
232
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
233
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
234
+
235
+ const selectAllCheckbox = getByLabelText('Select all');
236
+ selectAllCheckbox.click();
237
+ expect(queryByText(`${mockErrata.total} selected`)).toBeInTheDocument();
238
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
239
+
240
+ getAllByLabelText('Go to next page')[0].click();
241
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
242
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
243
+
244
+ assertNockRequest(autocompleteScope);
245
+ assertNockRequest(scope, done);
246
+ assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
247
+ });
248
+
249
+ test('Can deselect all errata across pages through checkbox', async (done) => {
250
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
251
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
252
+ const mockErrata = makeMockErrata({ page: 1 });
253
+ // return errata data results when we look for errata
254
+
255
+ // return errata data results when we look for errata
256
+ const scope = nockInstance
257
+ .get(hostErrata)
258
+ .query(defaultQuery)
259
+ .reply(200, mockErrata);
260
+
261
+ const scope2 = nockInstance
262
+ .get(hostErrata)
263
+ .query(page2Query)
264
+ .reply(200, makeMockErrata({ page: 2 }));
265
+
266
+ const {
267
+ queryByText,
268
+ getAllByText,
269
+ getByLabelText,
270
+ getAllByLabelText,
271
+ } = renderWithRedux(<ErrataTab />, renderOptions());
272
+
273
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
274
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
275
+
276
+ const selectAllCheckbox = getByLabelText('Select all');
277
+ selectAllCheckbox.click();
278
+ expect(queryByText(`${mockErrata.total} selected`)).toBeInTheDocument();
279
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
280
+
281
+ selectAllCheckbox.click();
282
+ expect(queryByText(`${mockErrata.total} selected`)).not.toBeInTheDocument();
283
+ expect(getByLabelText('Select row 0').checked).toEqual(false);
284
+
285
+ getAllByLabelText('Go to next page')[0].click();
286
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
287
+ expect(getByLabelText('Select row 0').checked).toEqual(false);
288
+
289
+ assertNockRequest(autocompleteScope);
290
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
291
+ assertNockRequest(scope2, done);
292
+ });
293
+
294
+
295
+ test('Can select & deselect errata across pages', async (done) => {
296
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
297
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
298
+
299
+ // return errata data results when we look for errata
300
+ const scope = nockInstance
301
+ .get(hostErrata)
302
+ .query(defaultQuery)
303
+ .reply(200, makeMockErrata({ page: 1 }));
304
+
305
+ const scope2 = nockInstance
306
+ .get(hostErrata)
307
+ .query(page2Query)
308
+ .reply(200, makeMockErrata({ page: 2 }));
309
+
310
+ const {
311
+ queryByText,
312
+ getAllByText,
313
+ getByLabelText,
314
+ getAllByLabelText,
315
+ } = renderWithRedux(<ErrataTab />, renderOptions());
316
+
317
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
318
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
319
+
320
+ getByLabelText('Select row 0').click();
321
+ getByLabelText('Select row 1').click();
322
+
323
+ getAllByLabelText('Go to next page')[0].click();
324
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
325
+
326
+ getByLabelText('Select row 0').click();
327
+ getByLabelText('Select row 1').click();
328
+
329
+ expect(queryByText('4 selected')).toBeInTheDocument();
330
+
331
+ assertNockRequest(autocompleteScope);
332
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
333
+ assertNockRequest(scope2, done);
334
+ });
335
+
336
+ test('Can select & de-select all errata through selectDropDown', async (done) => {
337
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
338
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
339
+ const mockErrata = makeMockErrata({});
340
+ // return errata data results when we look for errata
341
+ const scope = nockInstance
342
+ .get(hostErrata)
343
+ .query(defaultQuery)
344
+ .reply(200, mockErrata);
345
+
346
+ const {
347
+ getByText,
348
+ queryByText,
349
+ getAllByText,
350
+ getByLabelText,
351
+ } = renderWithRedux(<ErrataTab />, renderOptions());
352
+
353
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
354
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
355
+
356
+ const selectDropDown = getByLabelText('Select');
357
+ selectDropDown.click();
358
+
359
+ const selectAll = getByText(`Select all (${mockErrata.total})`);
360
+ expect(selectAll).toBeInTheDocument();
361
+ selectAll.click();
362
+
363
+ expect(queryByText(`${mockErrata.total} selected`)).toBeInTheDocument();
364
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
365
+
366
+ selectDropDown.click();
367
+ const selectNone = getByText('Select none (0)');
368
+ selectNone.click();
369
+
370
+ expect(queryByText(`${mockErrata.total} selected`)).not.toBeInTheDocument();
371
+ expect(getByLabelText('Select row 0').checked).toEqual(false);
372
+
373
+ assertNockRequest(autocompleteScope);
374
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
375
+ });
376
+
377
+ test('Can de-select items in select all mode across pages', async (done) => {
378
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
379
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
380
+ const mockErrata = makeMockErrata({ page: 1 });
381
+
382
+ // return errata data results when we look for errata
383
+ const scope = nockInstance
384
+ .get(hostErrata)
385
+ .query(defaultQuery)
386
+ .reply(200, mockErrata);
387
+
388
+ const scope2 = nockInstance
389
+ .get(hostErrata)
390
+ .query({ ...defaultQueryWithoutSearch, page: 1 })
391
+ .reply(200, makeMockErrata({ page: 2 }));
392
+
393
+ const scope3 = nockInstance
394
+ .get(hostErrata)
395
+ .query(page2Query)
396
+ .reply(200, makeMockErrata({ page: 2 }));
397
+
398
+ const {
399
+ queryByText,
400
+ getAllByText,
401
+ getByLabelText,
402
+ getAllByLabelText,
403
+ } = renderWithRedux(<ErrataTab />, renderOptions());
404
+
405
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
406
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
407
+
408
+ const selectAllCheckbox = getByLabelText('Select all');
409
+ selectAllCheckbox.click();
410
+ expect(queryByText(`${mockErrata.total} selected`)).toBeInTheDocument();
411
+
412
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
413
+ getByLabelText('Select row 0').click(); // de select
414
+
415
+ expect(queryByText(`${mockErrata.total - 1} selected`)).toBeInTheDocument();
416
+ expect(getByLabelText('Select row 0').checked).toEqual(false);
417
+
418
+ // goto next page
419
+ getAllByLabelText('Go to next page')[0].click();
420
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
421
+
422
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
423
+ getByLabelText('Select row 0').click(); // de select
424
+
425
+ expect(queryByText(`${mockErrata.total - 2} selected`)).toBeInTheDocument();
426
+ expect(getByLabelText('Select row 0').checked).toEqual(false);
427
+
428
+ // goto previous page
429
+ getAllByLabelText('Go to previous page')[0].click();
430
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
431
+
432
+ expect(getByLabelText('Select row 0').checked).toEqual(false);
433
+ expect(getByLabelText('Select row 1').checked).toEqual(true);
434
+ getByLabelText('Select row 1').click(); // de select
435
+
436
+ expect(queryByText(`${mockErrata.total - 3} selected`)).toBeInTheDocument();
437
+ expect(getByLabelText('Select row 1').checked).toEqual(false);
438
+
439
+ assertNockRequest(autocompleteScope);
440
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
441
+ assertNockRequest(scope2, done);
442
+ assertNockRequest(scope3, done);
443
+ });
444
+
445
+ test('Can select page and select only items on the page', async (done) => {
446
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
447
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
448
+ const mockErrata = makeMockErrata({});
449
+ // return errata data results when we look for errata
450
+ const scope = nockInstance
451
+ .get(hostErrata)
452
+ .query(defaultQuery)
453
+ .reply(200, mockErrata);
454
+
455
+ const {
456
+ getByText,
457
+ queryByText,
458
+ getAllByText,
459
+ getByLabelText,
460
+ } = renderWithRedux(<ErrataTab />, renderOptions());
461
+
462
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
463
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
464
+
465
+ const selectDropDown = getByLabelText('Select');
466
+ selectDropDown.click();
467
+
468
+ const selectPage = getByText('Select page (20)');
469
+ expect(selectPage).toBeInTheDocument();
470
+ selectPage.click();
471
+
472
+ expect(queryByText('20 selected')).toBeInTheDocument();
473
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
474
+
475
+ assertNockRequest(autocompleteScope);
476
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
477
+ });
478
+
479
+ test('Select all is disabled if all rows are selected', async (done) => {
480
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
481
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
482
+ const mockErrata = makeMockErrata({});
483
+ // return errata data results when we look for errata
484
+ const scope = nockInstance
485
+ .get(hostErrata)
486
+ .query(defaultQuery)
487
+ .reply(200, mockErrata);
488
+
489
+ const {
490
+ getByText,
491
+ queryByText,
492
+ getAllByText,
493
+ getByLabelText,
494
+ } = renderWithRedux(<ErrataTab />, renderOptions());
495
+
496
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
497
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
498
+
499
+ const selectDropDown = getByLabelText('Select');
500
+ selectDropDown.click();
501
+
502
+ const selectAll = getByText(`Select all (${mockErrata.total})`);
503
+ expect(selectAll).toBeInTheDocument();
504
+ expect(selectAll).toHaveAttribute('aria-disabled', 'false');
505
+ selectAll.click();
506
+
507
+ expect(queryByText(`${mockErrata.total} selected`)).toBeInTheDocument();
508
+
509
+ // click the dropdown again and make sure select all is disabled
510
+ selectDropDown.click();
511
+ expect(getByText(`Select all (${mockErrata.total})`)).toHaveAttribute('aria-disabled', 'true');
512
+ expect(getByText('Select page (20)')).toHaveAttribute('aria-disabled', 'true');
513
+ expect(getByText('Select none (0)')).toHaveAttribute('aria-disabled', 'false');
514
+
515
+ // Select none
516
+ getByText('Select none (0)').click();
517
+ selectDropDown.click();
518
+ expect(getByText(`Select all (${mockErrata.total})`)).toHaveAttribute('aria-disabled', 'false');
519
+ expect(getByText('Select page (20)')).toHaveAttribute('aria-disabled', 'false');
520
+ expect(getByText('Select none (0)')).toHaveAttribute('aria-disabled', 'true');
521
+
522
+ // Select page
523
+ getByText('Select page (20)').click();
524
+ selectDropDown.click();
525
+ expect(getByText(`Select all (${mockErrata.total})`)).toHaveAttribute('aria-disabled', 'false');
526
+ expect(getByText('Select page (20)')).toHaveAttribute('aria-disabled', 'true');
527
+ expect(getByText('Select none (0)')).toHaveAttribute('aria-disabled', 'false');
528
+
529
+ assertNockRequest(autocompleteScope);
530
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
531
+ });
532
+
533
+ test('Toggle Group shows if it\'s not the default content view or library enviroment', async (done) => {
534
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
535
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
536
+ const mockErrata = makeMockErrata({});
537
+ // return errata data results when we look for errata
538
+ const scope = nockInstance
539
+ .get(hostErrata)
540
+ .query(defaultQuery)
541
+ .reply(200, mockErrata);
542
+
543
+ const {
544
+ queryByLabelText,
545
+ getAllByText,
546
+ } = renderWithRedux(<ErrataTab />, renderOptions());
547
+
548
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
549
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
550
+ expect(queryByLabelText('Installable Errata')).toBeInTheDocument();
551
+ assertNockRequest(autocompleteScope);
552
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
553
+ });
554
+
555
+ test('Toggle Group does not show if it\'s the default content view ', async (done) => {
556
+ const options = renderOptions({
557
+ ...contentFacetAttributes,
558
+ content_view_default: true,
559
+ });
560
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
561
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
562
+ const mockErrata = makeMockErrata({});
563
+ // return errata data results when we look for errata
564
+ const scope = nockInstance
565
+ .get(hostErrata)
566
+ .query(defaultQuery)
567
+ .reply(200, mockErrata);
568
+
569
+ const {
570
+ queryByLabelText,
571
+ getAllByText,
572
+ } = renderWithRedux(<ErrataTab />, options);
573
+
574
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
575
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
576
+ expect(queryByLabelText('Installable Errata')).not.toBeInTheDocument();
577
+ assertNockRequest(autocompleteScope);
578
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
579
+ });
580
+
581
+ test('Toggle Group does not show if it\'s the library environment', async (done) => {
582
+ const options = renderOptions({
583
+ ...contentFacetAttributes,
584
+ lifecycle_environment_library: true,
585
+ });
586
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
587
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
588
+ const mockErrata = makeMockErrata({});
589
+ // return errata data results when we look for errata
590
+ const scope = nockInstance
591
+ .get(hostErrata)
592
+ .query(defaultQuery)
593
+ .reply(200, mockErrata);
594
+
595
+ const {
596
+ queryByLabelText,
597
+ getAllByText,
598
+ } = renderWithRedux(<ErrataTab />, options);
599
+
600
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
601
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
602
+ expect(queryByLabelText('Installable Errata')).not.toBeInTheDocument();
603
+ assertNockRequest(autocompleteScope);
604
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
605
+ });
606
+
607
+ test('Selection is disabled for errata which are applicable but not installable', async (done) => {
608
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
609
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
610
+ firstErrata.installable = false;
611
+ // return errata data results when we look for errata
612
+ const scope = nockInstance
613
+ .get(hostErrata)
614
+ .query(defaultQuery)
615
+ .reply(200, mockErrataData);
616
+
617
+ const {
618
+ getAllByText,
619
+ getByLabelText,
620
+ } = renderWithRedux(<ErrataTab />, renderOptions());
621
+
622
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
623
+ await patientlyWaitFor(() => expect(getAllByText(firstErrata.severity)[0]).toBeInTheDocument());
624
+ expect(getByLabelText('Select row 0')).toBeDisabled();
625
+ expect(getByLabelText('Select row 1')).not.toBeDisabled();
626
+
627
+ assertNockRequest(autocompleteScope);
628
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
629
+ });
630
+
631
+ test('Can select only installable errata across pages through checkbox', async (done) => {
632
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
633
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
634
+ const mockErrata = makeMockErrata({ page: 1 });
635
+ const first = mockErrata.results[0];
636
+ first.installable = false;
637
+ mockErrata.selectable = mockErrata.total - 1;
638
+ // return errata data results when we look for errata
639
+
640
+ // return errata data results when we look for errata
641
+ const scope = nockInstance
642
+ .get(hostErrata)
643
+ .query(defaultQuery)
644
+ .reply(200, mockErrata);
645
+
646
+ const scope2 = nockInstance
647
+ .get(hostErrata)
648
+ .query(page2Query)
649
+ .reply(200, makeMockErrata({ page: 2 }));
650
+
651
+ const {
652
+ queryByText,
653
+ getAllByText,
654
+ getByLabelText,
655
+ getAllByLabelText,
656
+ } = renderWithRedux(<ErrataTab />, renderOptions());
657
+
658
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
659
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
660
+
661
+ const selectAllCheckbox = getByLabelText('Select all');
662
+ selectAllCheckbox.click();
663
+ expect(queryByText(`${mockErrata.selectable} selected`)).toBeInTheDocument();
664
+ expect(queryByText(`${mockErrata.total} selected`)).not.toBeInTheDocument();
665
+ expect(getByLabelText('Select row 0')).toBeDisabled();
666
+ getAllByLabelText('Go to next page')[0].click();
667
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
668
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
669
+
670
+ assertNockRequest(autocompleteScope);
671
+ assertNockRequest(scope, done);
672
+ assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
673
+ });
674
+
675
+ test('Can toggle with the Toggle Group ', async (done) => {
676
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
677
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
678
+ const mockErrata = makeMockErrata({});
679
+ // return errata data results when we look for errata
680
+ const scope = nockInstance
681
+ .get(hostErrata)
682
+ .query(defaultQuery)
683
+ .reply(200, mockErrata);
684
+
685
+ const {
686
+ queryByLabelText,
687
+ getAllByText,
688
+ } = renderWithRedux(<ErrataTab />, renderOptions());
689
+
690
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
691
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
692
+ expect(queryByLabelText('Installable Errata')).toBeInTheDocument();
693
+ expect(queryByLabelText('Show Installable')).toHaveAttribute('aria-pressed', 'true');
694
+ expect(queryByLabelText('Show All')).toHaveAttribute('aria-pressed', 'false');
695
+ assertNockRequest(autocompleteScope);
696
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
697
+ });
698
+
699
+ test('Can filter by errata type', async (done) => {
700
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
701
+ const scope = nockInstance
702
+ .get(hostErrata)
703
+ .query(defaultQuery)
704
+ .reply(200, mockErrataData);
705
+
706
+ const scope2 = nockInstance
707
+ .get(hostErrata)
708
+ .query({ ...defaultQuery, type: 'security' })
709
+ .reply(200, { ...mockErrataData, results: [firstErrata] });
710
+
711
+ const {
712
+ queryByText,
713
+ getByRole,
714
+ getAllByText,
715
+ getByText,
716
+ } = renderWithRedux(<ErrataTab />, renderOptions());
717
+
718
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
719
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
720
+ // the Bugfix text in the table is just a text node, while the dropdown is a button
721
+ expect(getByText('Bugfix', { ignore: ['button', 'title'] })).toBeInTheDocument();
722
+ expect(getByText('Enhancement', { ignore: ['button', 'title'] })).toBeInTheDocument();
723
+ const typeDropdown = queryByText('Type', { ignore: 'th' });
724
+ expect(typeDropdown).toBeInTheDocument();
725
+ fireEvent.click(typeDropdown);
726
+ const security = getByRole('option', { name: 'select Security' });
727
+ fireEvent.click(security);
728
+ await patientlyWaitFor(() => {
729
+ expect(queryByText('Bugfix')).not.toBeInTheDocument();
730
+ expect(queryByText('Enhancement')).not.toBeInTheDocument();
731
+ });
732
+
733
+
734
+ assertNockRequest(autocompleteScope);
735
+ assertNockRequest(scope);
736
+ assertNockRequest(searchDelayScope);
737
+ assertNockRequest(autoSearchScope);
738
+ assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
739
+ });
740
+
741
+ test('Can filter by severity', async (done) => {
742
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
743
+ const scope = nockInstance
744
+ .get(hostErrata)
745
+ .query(defaultQuery)
746
+ .reply(200, mockErrataData);
747
+
748
+ const scope2 = nockInstance
749
+ .get(hostErrata)
750
+ .query({ ...defaultQuery, severity: 'Important' })
751
+ .reply(200, { ...mockErrataData, results: [thirdErrata] });
752
+
753
+ const {
754
+ queryByText,
755
+ getByRole,
756
+ getAllByText,
757
+ getByText,
758
+ } = renderWithRedux(<ErrataTab />, renderOptions());
759
+
760
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
761
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
762
+ // the Bugfix text in the table is just a text node, while the dropdown is a button
763
+ expect(getByText('Moderate', { ignore: ['button', 'title'] })).toBeInTheDocument();
764
+ expect(getByText('Important', { ignore: ['.pf-c-select__toggle-text', 'title'] })).toBeInTheDocument();
765
+ expect(getByText('Critical', { ignore: ['button', 'title'] })).toBeInTheDocument();
766
+ const severityDropdown = queryByText('Severity', { ignore: 'th' });
767
+ expect(severityDropdown).toBeInTheDocument();
768
+ fireEvent.click(severityDropdown);
769
+ const important = getByRole('option', { name: 'select Important' });
770
+ fireEvent.click(important);
771
+ await patientlyWaitFor(() => {
772
+ expect(queryByText('Moderate', { ignore: ['.pf-c-select__toggle-text'] })).not.toBeInTheDocument();
773
+ expect(queryByText('Critical', { ignore: ['.pf-c-select__toggle-text'] })).not.toBeInTheDocument();
774
+ });
775
+ await patientlyWaitFor(() => {
776
+ expect(getByText('Important', { ignore: ['.pf-c-select__toggle-text', 'title'] })).toBeInTheDocument();
777
+ });
778
+
779
+
780
+ assertNockRequest(autocompleteScope);
781
+ assertNockRequest(scope);
782
+ assertNockRequest(searchDelayScope);
783
+ assertNockRequest(autoSearchScope);
784
+ assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
785
+ });