foreman_rh_cloud 5.0.29 → 5.0.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/config/Gemfile.lock.gh_test +204 -168
  3. data/config/package-lock.json +41822 -0
  4. data/config/package-lock.json.gh_test +14336 -7973
  5. data/config/routes.rb +1 -1
  6. data/lib/foreman_inventory_upload/generators/tags.rb +8 -1
  7. data/lib/foreman_rh_cloud/engine.rb +10 -1
  8. data/lib/foreman_rh_cloud/version.rb +1 -1
  9. data/package.json +1 -1
  10. data/test/unit/rh_cloud_permissions_test.rb +14 -0
  11. data/test/unit/tags_generator_test.rb +15 -0
  12. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +1 -1
  13. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/InventoryFilter.js +3 -3
  14. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/index.js +0 -2
  15. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +1 -1
  16. data/webpack/ForemanRhCloudFills.js +8 -1
  17. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +1 -1
  18. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +1 -1
  19. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +75 -0
  20. data/webpack/InsightsHostDetailsTab/InsightsTotalRiskChart.js +147 -0
  21. data/webpack/InsightsHostDetailsTab/NewHostDetailsTab.js +0 -1
  22. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +1 -0
  23. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +0 -0
  24. data/webpack/common/ForemanTasks/ForemanTasksActions.js +1 -1
  25. metadata +7 -4
  26. data/webpack/__mocks__/foremanReact/components/Layout/LayoutSelectors.js +0 -1
data/config/routes.rb CHANGED
@@ -18,7 +18,7 @@ Rails.application.routes.draw do
18
18
  namespace :insights_cloud do
19
19
  resources :tasks, only: [:create]
20
20
  resource :settings, only: [:show, :update]
21
- resources :hits, except: %i[show] do
21
+ resources :hits, only: [:index] do
22
22
  collection do
23
23
  get 'auto_complete_search'
24
24
  get 'resolutions', to: 'hits#resolutions'
@@ -13,7 +13,7 @@ module ForemanInventoryUpload
13
13
  organizations +
14
14
  content_data +
15
15
  satellite_server_data
16
- ).reject { |key, value| value.empty? }
16
+ ).reject { |key, value| value.empty? }.map { |key, value| [key, truncated_value(value)] }
17
17
  end
18
18
 
19
19
  def generate_parameters
@@ -21,6 +21,7 @@ module ForemanInventoryUpload
21
21
 
22
22
  (@host.host_params || {})
23
23
  .select { |_name, value| value.present? || value.is_a?(FalseClass) }
24
+ .map { |key, value| [key, truncated_value(value)] }
24
25
  end
25
26
 
26
27
  private
@@ -57,6 +58,12 @@ module ForemanInventoryUpload
57
58
  ['organization_id', @host.organization_id.to_s],
58
59
  ]
59
60
  end
61
+
62
+ def truncated_value(value)
63
+ return 'Original value exceeds 250 characters' if value.to_s.length > 250
64
+
65
+ value
66
+ end
60
67
  end
61
68
  end
62
69
  end
@@ -48,13 +48,22 @@ module ForemanRhCloud
48
48
  security_block :foreman_rh_cloud do
49
49
  permission(
50
50
  :generate_foreman_rh_cloud,
51
- 'foreman_inventory_upload/reports': [:generate]
51
+ 'foreman_inventory_upload/reports': [:generate],
52
+ 'foreman_inventory_upload/tasks': [:create],
53
+ 'api/v2/rh_cloud/inventory': [:sync_inventory_status, :download_file, :generate_report, :enable_cloud_connector],
54
+ 'foreman_inventory_upload/uploads': [:enable_cloud_connector],
55
+ 'foreman_inventory_upload/uploads_settings': [:set_advanced_setting],
56
+ 'insights_cloud/settings': [:save_token_and_sync, :update],
57
+ 'insights_cloud/tasks': [:create]
52
58
  )
53
59
  permission(
54
60
  :view_foreman_rh_cloud,
55
61
  'foreman_inventory_upload/accounts': [:index],
56
62
  'foreman_inventory_upload/reports': [:last],
57
63
  'foreman_inventory_upload/uploads': [:auto_upload, :show_auto_upload, :download_file, :last],
64
+ 'foreman_inventory_upload/tasks': [:show],
65
+ 'foreman_inventory_upload/cloud_status': [:index],
66
+ 'foreman_inventory_upload/uploads_settings': [:index],
58
67
  'react': [:index]
59
68
  )
60
69
  permission(
@@ -1,3 +1,3 @@
1
1
  module ForemanRhCloud
2
- VERSION = '5.0.29'.freeze
2
+ VERSION = '5.0.30'.freeze
3
3
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foreman_rh_cloud",
3
- "version": "5.0.29",
3
+ "version": "5.0.30",
4
4
  "description": "Inventory Upload =============",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,14 @@
1
+ require 'test_plugin_helper'
2
+ require 'unit/shared/access_permissions_test_base'
3
+
4
+ class RhCloudPermissionsTest < ActiveSupport::TestCase
5
+ include AccessPermissionsTestBase
6
+
7
+ check_routes(
8
+ Rails.application.routes,
9
+ [
10
+ 'insights_cloud/api/machine_telemetries/forward_request',
11
+ 'insights_cloud/api/machine_telemetries/branch_info',
12
+ ],
13
+ skip_patterns: [/^(?!foreman_inventory_upload|insights_cloud|.*rh_cloud).*/]) # include only plugin paths
14
+ end
@@ -103,6 +103,21 @@ class TagsGeneratorTest < ActiveSupport::TestCase
103
103
  assert_equal 0, actual.count
104
104
  end
105
105
 
106
+ test 'truncates parameter tags' do
107
+ Setting[:include_parameter_tags] = true
108
+
109
+ @host.stubs(:host_params).returns(
110
+ {
111
+ 'str_param' => 'a' * 251,
112
+ }
113
+ )
114
+
115
+ generator = create_generator
116
+ actual = Hash[generator.generate_parameters]
117
+
118
+ assert_equal 'Original value exceeds 250 characters', actual['str_param']
119
+ end
120
+
106
121
  private
107
122
 
108
123
  def create_generator
@@ -1,5 +1,5 @@
1
1
  import { API } from 'foremanReact/redux/API';
2
- import { addToast } from 'foremanReact/redux/actions/toasts';
2
+ import { addToast } from 'foremanReact/components/ToastsList';
3
3
  import { inventoryUrl } from '../../ForemanInventoryHelpers';
4
4
  import {
5
5
  INVENTORY_ACCOUNT_STATUS_POLLING,
@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
4
4
  import { FormGroup, TextInput } from '@patternfly/react-core';
5
5
  import { noop } from 'foremanReact/common/helpers';
6
6
  import { translate as __ } from 'foremanReact/common/I18n';
7
+ import { useForemanOrganization } from 'foremanReact/Root/Context/ForemanContext';
7
8
  import ClearButton from './Components/ClearButton';
8
9
  import './inventoryFilter.scss';
9
10
  import { ANY_ORGANIZATION } from './InventoryFilterConstants';
@@ -12,13 +13,14 @@ const InventoryFilter = ({
12
13
  handleFilterChange,
13
14
  handleFilterClear,
14
15
  filterTerm,
15
- organization,
16
16
  }) => {
17
17
  useEffect(() => {
18
18
  const initialTerm = organization === ANY_ORGANIZATION ? '' : organization;
19
19
  handleFilterChange(initialTerm);
20
20
  }, []);
21
21
 
22
+ const organization = useForemanOrganization()?.title;
23
+
22
24
  return (
23
25
  <form id="inventory_filter_form">
24
26
  <FormGroup>
@@ -39,14 +41,12 @@ InventoryFilter.propTypes = {
39
41
  handleFilterChange: PropTypes.func,
40
42
  handleFilterClear: PropTypes.func,
41
43
  filterTerm: PropTypes.string,
42
- organization: PropTypes.string,
43
44
  };
44
45
 
45
46
  InventoryFilter.defaultProps = {
46
47
  handleFilterChange: noop,
47
48
  handleFilterClear: noop,
48
49
  filterTerm: '',
49
- organization: '',
50
50
  };
51
51
 
52
52
  export default InventoryFilter;
@@ -1,6 +1,5 @@
1
1
  import { bindActionCreators } from 'redux';
2
2
  import { connect } from 'react-redux';
3
- import { selectCurrentOrganization } from 'foremanReact/components/Layout/LayoutSelectors';
4
3
  import reducer from './InventoryFilterReducer';
5
4
  import * as actions from './InventoryFilterActions';
6
5
  import InventoryFilter from './InventoryFilter';
@@ -10,7 +9,6 @@ export const reducers = { inventoryFilter: reducer };
10
9
 
11
10
  const mapStateToProps = state => ({
12
11
  filterTerm: selectFilterTerm(state),
13
- organization: selectCurrentOrganization(state),
14
12
  });
15
13
  // map action dispatchers to props
16
14
  const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { post } from 'foremanReact/redux/API';
3
- import { addToast } from 'foremanReact/redux/actions/toasts';
3
+ import { addToast } from 'foremanReact/components/ToastsList';
4
4
  import { translate as __ } from 'foremanReact/common/I18n';
5
5
  import { inventoryUrl } from '../../../../ForemanInventoryHelpers';
6
6
  import Toast from './components/Toast';
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
3
  import InventoryAutoUploadSwitcher from './ForemanInventoryUpload/SubscriptionsPageExtension/InventoryAutoUpload';
4
4
  import NewHostDetailsTab from './InsightsHostDetailsTab/NewHostDetailsTab';
5
+ import InsightsTotalRiskCard from './InsightsHostDetailsTab/InsightsTotalRiskChart';
5
6
 
6
7
  const fills = [
7
8
  {
@@ -14,7 +15,13 @@ const fills = [
14
15
  slot: 'host-details-page-tabs',
15
16
  name: 'Insights',
16
17
  component: props => <NewHostDetailsTab {...props} />,
17
- weight: 700,
18
+ weight: 400,
19
+ },
20
+ {
21
+ slot: 'details-cards',
22
+ name: 'insights-total-risk-chart',
23
+ component: props => <InsightsTotalRiskCard {...props} />,
24
+ weight: 1100,
18
25
  },
19
26
  ];
20
27
 
@@ -1,5 +1,5 @@
1
1
  import { API } from 'foremanReact/redux/API';
2
- import { addToast } from 'foremanReact/redux/actions/toasts';
2
+ import { addToast } from 'foremanReact/components/ToastsList';
3
3
  import { insightsCloudUrl } from '../../InsightsCloudSyncHelpers';
4
4
  import {
5
5
  INSIGHTS_SYNC_SETTING_SET,
@@ -1,5 +1,5 @@
1
1
  import { API } from 'foremanReact/redux/API';
2
- import { addToast } from 'foremanReact/redux/actions/toasts';
2
+ import { addToast } from 'foremanReact/components/ToastsList';
3
3
  import { insightsCloudUrl } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
4
4
  import {
5
5
  INSIGHTS_HITS_REQUEST,
@@ -1,2 +1,77 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+
1
3
  export const INSIGHTS_HITS_REQUEST = 'INSIGHTS_HITS_REQUEST';
2
4
  export const INSIGHTS_HITS_SUCCESS = 'INSIGHTS_HITS_SUCCESS';
5
+
6
+ export const getInitialRisks = () => ({
7
+ 1: {
8
+ value: 0,
9
+ title: __('Low'),
10
+ hoverFill: '#2b9af3',
11
+ },
12
+ 2: {
13
+ value: 0,
14
+ title: __('Moderate'),
15
+ hoverFill: '#d5a632',
16
+ },
17
+ 3: {
18
+ value: 0,
19
+ title: __('Important'),
20
+ hoverFill: '#ec7a08',
21
+ },
22
+ 4: {
23
+ value: 0,
24
+ title: __('Critical'),
25
+ hoverFill: '#7d1007',
26
+ },
27
+ total: 0,
28
+ });
29
+
30
+ const colorScale = ['#bee1f4', '#f4c145', '#f4b678', '#c9190b'];
31
+
32
+ export const theme = {
33
+ legend: {
34
+ gutter: 20,
35
+ orientation: 'horizontal',
36
+ titleOrientation: 'top',
37
+ style: {
38
+ data: {
39
+ type: 'square',
40
+ },
41
+ labels: {
42
+ fontFamily: 'RedHatText',
43
+ fontSize: 14,
44
+ letterSpacing: 'normal',
45
+ padding: 10,
46
+ stroke: 'transparent',
47
+ fill: '#06c',
48
+ textDecorationColor: '#06c',
49
+ },
50
+ title: {
51
+ fontFamily: 'RedHatText',
52
+ fontSize: 14,
53
+ letterSpacing: 'normal',
54
+ padding: 2,
55
+ stroke: 'transparent',
56
+ },
57
+ },
58
+ colorScale,
59
+ },
60
+ pie: {
61
+ colorScale,
62
+ height: 230,
63
+ padAngle: 1,
64
+ padding: 20,
65
+ style: {
66
+ data: { padding: 8, stroke: 'transparent', strokeWidth: 1 },
67
+ labels: {
68
+ fontFamily: 'RedHatText',
69
+ fontSize: 14,
70
+ letterSpacing: 'normal',
71
+ padding: 8,
72
+ stroke: 'transparent',
73
+ },
74
+ },
75
+ width: 230,
76
+ },
77
+ };
@@ -0,0 +1,147 @@
1
+ import React, { useEffect, useState, useMemo } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useDispatch } from 'react-redux';
4
+ import { push } from 'connected-react-router';
5
+ import { useHistory } from 'react-router-dom';
6
+ import { DropdownItem, Bullseye, Title } from '@patternfly/react-core';
7
+ import { ChartDonut, ChartLegend, ChartLabel } from '@patternfly/react-charts';
8
+ import { STATUS } from 'foremanReact/constants';
9
+ import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
10
+ import CardTemplate from 'foremanReact/components/HostDetails/Templates/CardItem/CardTemplate';
11
+ import { translate as __ } from 'foremanReact/common/I18n';
12
+ import SkeletonLoader from 'foremanReact/components/common/SkeletonLoader';
13
+ import { insightsCloudUrl } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
14
+ import { getInitialRisks, theme } from './InsightsTabConstants';
15
+
16
+ const InsightsTotalRiskCard = ({ hostDetails: { id } }) => {
17
+ const [totalRisks, setTotalRisks] = useState(getInitialRisks());
18
+ const hashHistory = useHistory();
19
+ const dispatch = useDispatch();
20
+ const API_KEY = `HOST_${id}_RECOMMENDATIONS`;
21
+ const API_OPTIONS = useMemo(() => ({ key: API_KEY }), [API_KEY]);
22
+ const {
23
+ status = STATUS.PENDING,
24
+ response: { hits = [] },
25
+ } = useAPI('get', insightsCloudUrl(`hits/${id}`), API_OPTIONS);
26
+
27
+ useEffect(() => {
28
+ if (status !== STATUS.PENDING) {
29
+ const risks = getInitialRisks();
30
+ hits.forEach(({ total_risk: risk }) => {
31
+ risks[risk].value += 1;
32
+ });
33
+ risks.total = hits.length;
34
+ setTotalRisks(risks);
35
+ }
36
+ }, [hits, status]);
37
+
38
+ const onChartClick = (evt, { index }) => {
39
+ hashHistory.push(`/Insights`);
40
+ dispatch(
41
+ push({
42
+ search: `search=total_risk+%3D+${index + 1}`,
43
+ })
44
+ );
45
+ };
46
+
47
+ const onChartHover = (evt, { index }) => [
48
+ {
49
+ mutation: ({ style }) => ({
50
+ style: { ...style, fill: totalRisks[index + 1]?.hoverFill },
51
+ }),
52
+ },
53
+ ];
54
+
55
+ const { 1: low, 2: moderate, 3: important, 4: critical, total } = totalRisks;
56
+
57
+ // eslint-disable-next-line react/prop-types
58
+ const LegendLabel = ({ index, ...rest }) => (
59
+ <a key={index} onClick={() => onChartClick(null, { index })}>
60
+ <ChartLabel {...rest} />
61
+ </a>
62
+ );
63
+
64
+ const legend = (
65
+ <ChartLegend
66
+ height={400}
67
+ width={200}
68
+ fontSize={14}
69
+ rowGutter={{ top: -5, bottom: -5 }}
70
+ orientation="vertical"
71
+ labelComponent={<LegendLabel />}
72
+ data={[
73
+ { name: `${low.title}: ${low.value}` },
74
+ { name: `${moderate.title}: ${moderate.value}` },
75
+ { name: `${important.title}: ${important.value}` },
76
+ { name: `${critical.title}: ${critical.value}` },
77
+ ]}
78
+ />
79
+ );
80
+
81
+ const cardBody = (
82
+ <ChartDonut
83
+ ariaDesc="Number of recommendations total-risks"
84
+ constrainToVisibleArea
85
+ data={[
86
+ { x: low.title, y: low.value },
87
+ { x: moderate.title, y: moderate.value },
88
+ { x: important.title, y: important.value },
89
+ { x: critical.title, y: critical.value },
90
+ ]}
91
+ labels={({ datum: { x, y } }) => `${x}: ${y}`}
92
+ legendComponent={legend}
93
+ legendPosition="right"
94
+ subTitle="Recommendations"
95
+ title={`${total}`}
96
+ padding={{
97
+ bottom: 20,
98
+ left: 20,
99
+ right: 140,
100
+ top: 20,
101
+ }}
102
+ width={350}
103
+ theme={theme}
104
+ events={[
105
+ {
106
+ target: 'data',
107
+ eventHandlers: {
108
+ onClick: onChartClick,
109
+ onMouseOver: onChartHover,
110
+ onMouseOut: () => [{ mutation: () => null }],
111
+ },
112
+ },
113
+ ]}
114
+ />
115
+ );
116
+
117
+ return (
118
+ <CardTemplate
119
+ header={__('Total Risks')}
120
+ dropdownItems={[
121
+ <DropdownItem
122
+ key="insights-tab"
123
+ onClick={() => hashHistory.push(`/Insights`)}
124
+ >
125
+ {__('View all recommendations')}
126
+ </DropdownItem>,
127
+ ]}
128
+ >
129
+ <SkeletonLoader
130
+ status={status}
131
+ emptyState={
132
+ <Bullseye>
133
+ <Title headingLevel="h4"> {__('No results found')} </Title>
134
+ </Bullseye>
135
+ }
136
+ >
137
+ <div id="rh-cloud-total-risk-card">{cardBody}</div>
138
+ </SkeletonLoader>
139
+ </CardTemplate>
140
+ );
141
+ };
142
+
143
+ InsightsTotalRiskCard.propTypes = {
144
+ hostDetails: PropTypes.object.isRequired,
145
+ };
146
+
147
+ export default InsightsTotalRiskCard;
@@ -20,7 +20,6 @@ import {
20
20
  selectSearch,
21
21
  selectHits,
22
22
  } from '../InsightsCloudSync/Components/InsightsTable/InsightsTableSelectors';
23
- import './InsightsTab.scss';
24
23
  import { redHatAdvisorSystems } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
25
24
 
26
25
  const NewHostDetailsTab = ({ hostName, router }) => {
@@ -1 +1,2 @@
1
1
  export const useForemanSettings = () => ({ perPage: 20 });
2
+ export const useForemanOrganization = () => ({ title: 'some-org' });
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { get } from 'foremanReact/redux/API';
3
3
  import { withInterval } from 'foremanReact/redux/middlewares/IntervalMiddleware';
4
- import { addToast } from 'foremanReact/redux/actions/toasts';
4
+ import { addToast } from 'foremanReact/components/ToastsList';
5
5
  import { translate as __ } from 'foremanReact/common/I18n';
6
6
  import { foremanTaskDetailsUrl } from './ForemanTasksHelpers';
7
7
  import { foremanUrl } from '../../ForemanRhCloudHelpers';
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_rh_cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.29
4
+ version: 5.0.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman Red Hat Cloud team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-29 00:00:00.000000000 Z
11
+ date: 2022-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: katello
@@ -176,6 +176,7 @@ files:
176
176
  - app/views/layouts/foreman_rh_cloud/application.html.erb
177
177
  - config/Gemfile.lock.gh_test
178
178
  - config/database.yml.example
179
+ - config/package-lock.json
179
180
  - config/package-lock.json.gh_test
180
181
  - config/package-lock.json.plugin
181
182
  - config/rh_cert-api_chain.pem
@@ -262,6 +263,7 @@ files:
262
263
  - test/unit/insights_facet_test.rb
263
264
  - test/unit/metadata_generator_test.rb
264
265
  - test/unit/rh_cloud_http_proxy_test.rb
266
+ - test/unit/rh_cloud_permissions_test.rb
265
267
  - test/unit/services/foreman_rh_cloud/branch_info_test.rb
266
268
  - test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb
267
269
  - test/unit/services/foreman_rh_cloud/cloud_status_service_test.rb
@@ -595,6 +597,7 @@ files:
595
597
  - webpack/InsightsHostDetailsTab/InsightsTabConstants.js
596
598
  - webpack/InsightsHostDetailsTab/InsightsTabReducer.js
597
599
  - webpack/InsightsHostDetailsTab/InsightsTabSelectors.js
600
+ - webpack/InsightsHostDetailsTab/InsightsTotalRiskChart.js
598
601
  - webpack/InsightsHostDetailsTab/NewHostDetailsTab.js
599
602
  - webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js
600
603
  - webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js
@@ -615,11 +618,10 @@ files:
615
618
  - webpack/__mocks__/foremanReact/common/helpers.js
616
619
  - webpack/__mocks__/foremanReact/components/Head.js
617
620
  - webpack/__mocks__/foremanReact/components/Layout/LayoutConstants.js
618
- - webpack/__mocks__/foremanReact/components/Layout/LayoutSelectors.js
621
+ - webpack/__mocks__/foremanReact/components/ToastsList/index.js
619
622
  - webpack/__mocks__/foremanReact/constants.js
620
623
  - webpack/__mocks__/foremanReact/redux/API/APISelectors.js
621
624
  - webpack/__mocks__/foremanReact/redux/API/index.js
622
- - webpack/__mocks__/foremanReact/redux/actions/toasts.js
623
625
  - webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js
624
626
  - webpack/__mocks__/foremanReact/routes/RouterSelector.js
625
627
  - webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js
@@ -696,6 +698,7 @@ test_files:
696
698
  - test/unit/insights_facet_test.rb
697
699
  - test/unit/metadata_generator_test.rb
698
700
  - test/unit/rh_cloud_http_proxy_test.rb
701
+ - test/unit/rh_cloud_permissions_test.rb
699
702
  - test/unit/services/foreman_rh_cloud/branch_info_test.rb
700
703
  - test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb
701
704
  - test/unit/services/foreman_rh_cloud/cloud_status_service_test.rb
@@ -1 +0,0 @@
1
- export const selectCurrentOrganization = state => 'some-org';